<?php

  /**
   * TagName
   *
   * ORM для таблицы тегов и рубрик
   *
   * @property      int    $id    идентификатор записи
   * @property      string $name  имя
   * @property      string $type  тип записи ('tag','rubric')
   * @property-read Tag[]  $tags  используемые в постах теги
   * @property-read int    $count количествово использований
   * @method TagName cloud()  выборка всех
   * @method TagName tag()    выборка тегов
   * @method TagName rubric() выборка рубрик
   */

  final class TagName extends Record
  {
  // типы тегов
    const TAG    = "tag";
    const RUBRIC = "rubric";

    /**
     * вернуть экземпляр модели
     *
     * @return TagName
     * @access public
     */
    public static function model($className = __CLASS__)
    {
      return parent::model($className);
    }

    /**
     * вернуть название таблицы
     *
     * @return string
     * @access public
     */
    public function tableName()
    {
      return "tag_names";
    }

    /**
     * правила проверки атрибутов модели
     *
     * @return array[]
     * @access public
     */
    public function rules()
    {
      return array(
        array("id", "exist", "className" => "TagName", "allowEmpty" => false, "on" => "update"),
        array("name", "required"),
        array("name", "length", "max" => $this->fieldSize("name"), "encoding" => "utf-8", "skipOnError" => true),
        array("name", "unique", "className" => "TagName", "caseSensitive" => false),
        array("type", "in", "range" => $this->enum("type"), "allowEmpty" => false)
      ) + parent::rules();
    }

    /**
     * действия перед проверкой
     *
     * @return bool
     * @access protected
     */
    protected function beforeValidate()
    {
      if ($success = parent::beforeValidate())
        $this->name = strip_tags($this->name);

      return $success;
    }

    /**
     * параметры выборки
     *
     * @return array[]
     * @access public
     */
    public function defaultScope()
    {
      return array("order" => "`id`") + parent::defaultScope();
    }

    /**
     * наборы фильтров для выборки
     *
     * @return array[]
     * @access public
     */
    public function scopes()
    {
      return array("cloud" => array()) + $this->enumScopes("type") + parent::scopes();
    }

    /**
     * связи с другими таблицами
     *
     * @return array[]
     * @access public
     */
    public function relations()
    {
      return array("tags" => array(self::HAS_MANY, "Tag", "tag_id")) + parent::relations();
    }

      /**
     * действия перед удалением
     *
     * @return bool
     * @access protected
     */
    protected function beforeDelete()
    {
      if ($success = parent::beforeDelete())
        Tag::model()->deleteAllByAttributes(array("tag_id" => $this->id));

      return $success;
    }

    /**
     * вернуть кол-во использований
     *
     * @return int
     * @access public
     */
    public function getCount()
    {
      return count($this->tags);
    }
  }

?>
